package com.cskaoyan.javase._1extends._6limit;

/**
 * 继承的限制
 * 思考几个问题:
 *      1.父类中的私有成员,能不能被子类继承?
 *          继承了,但是没有访问权限,导致子类无法直接访问父类中的私有成员
 *          可以间接在父类中写一个有访问权限的Getter方法去访问它
 *
 *      2.父类中构造器,能不能被子类继承?
 *          构造器的作用是在创建对象过程中,给成员变量赋值的
 *          没有必要让别的类继承
 *          构造器是不能被继承的
 *
 *      3.父类中的静态成员,能不能被子类继承?
 *          静态成员不考虑继承,也不是继承
 *          代码中可以用子类类名点访问父类静态成员
 *          不过是父子类共用了父类的静态成员
 *          静态成员永远属于类,可以被子类共用,但是这不是继承
 *
 * 何时使用继承？
 * 不要盲目的去使用继承，尤其不要单纯为了复用代码，而使用继承。使用继承应该严格考虑两个类是否具有"is-a"关系！
 * 教师类继承人类，学生类继承人类是可以理解的，也是符合继承的思想的（is-a）。
 * 但是教师类中有姓名、年龄属性，学生类也需要这些成员，能单纯为了复用成员，让学生类继承教师类吗？显然不行！
 * 在实际开发中，在开发前的会议讨论，需求策划上，一定要认真分析程序中类的关系，避免出现错误的继承。
 *
 * @since 10:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        // 'num' has private access in 'com.cskaoyan.javase._1extends._6limit.Father'
        // System.out.println(s.num);
        System.out.println(s.getNum());

        System.out.println("-------------------------------");
        System.out.println(Father.var);
        System.out.println(Son.var);
        Son.testStatic();

        Father.var = 888;
        System.out.println(Son.var);

    }
}

class Father {
    private int num = 100;
    static int var = 200;

    public static void testStatic() {
        System.out.println("static method");
    }

    public int getNum() {
        return num;
    }
}

class Son extends Father {

}
